
# -*- coding:utf-8 -*-

__author__ = 'zhl'

"""
专题报表-重要持股人 -重要股东二级市场交易明细表
"""
from EmQuantAPI import *
from datetime import timedelta, datetime
import time as _time
import traceback
import pandas as pd

"""
创建Pandas DataFrame 数据结构
label=list()
dict={0:[],1:[]}
"""


def dict_convert_dataframe(file,dict,label,df):
   
    for k,v in dict.items():
        data = [v]  
        df = df.append(pd.DataFrame(data,index=[k],columns=label))
        df.to_csv(file,mode="a",header=False)
    return df


def mainCallback(quantdata):
    """
    mainCallback 是主回调函数，可捕捉如下错误
    在start函数第三个参数位传入，该函数只有一个为c.EmQuantData类型的参数quantdata
    :param quantdata:c.EmQuantData
    :return:
    """
    print("mainCallback", str(quantdata))
    # 登录掉线或者 登陆数达到上线（即登录被踢下线） 这时所有的服务都会停止
    if str(quantdata.ErrorCode) == "10001011" or str(quantdata.ErrorCode) == "10001009":
        print("Your account is disconnect. You can force login automatically here if you need.")
    # 行情登录验证失败（每次连接行情服务器时需要登录验证）或者行情流量验证失败时，会取消所有订阅，用户需根据具体情况处理
    elif str(quantdata.ErrorCode) == "10001021" or str(quantdata.ErrorCode) == "10001022":
        print("Your all csq subscribe have stopped.")
    # 行情服务器断线自动重连连续6次失败（1分钟左右）不过重连尝试还会继续进行直到成功为止，遇到这种情况需要确认两边的网络状况
    elif str(quantdata.ErrorCode) == "10002009":
        print("Your all csq subscribe have stopped, reconnect 6 times fail.")
        # 行情订阅遇到一些错误(这些错误会导致重连，错误原因通过日志输出，统一转换成EQERR_QUOTE_RECONNECT在这里通知)，正自动重连并重新订阅,可以做个监控
    elif str(quantdata.ErrorCode) == "10002012":
        print("csq subscribe break on some error, reconnect and request automatically.")
        # 资讯服务器断线自动重连连续6次失败（1分钟左右）不过重连尝试还会继续进行直到成功为止，遇到这种情况需要确认两边的网络状况
    elif str(quantdata.ErrorCode) == "10002014":
        print("Your all cnq subscribe have stopped, reconnect 6 times fail.")
    # 资讯订阅遇到一些错误(这些错误会导致重连，错误原因通过日志输出，统一转换成EQERR_INFO_RECONNECT在这里通知)，正自动重连并重新订阅,可以做个监控
    elif str(quantdata.ErrorCode) == "10002013":
        print("cnq subscribe break on some error, reconnect and request automatically.")
    # 资讯登录验证失败（每次连接资讯服务器时需要登录验证）或者资讯流量验证失败时，会取消所有订阅，用户需根据具体情况处理
    elif str(quantdata.ErrorCode) == "10001024" or str(quantdata.ErrorCode) == "10001025":
        print("Your all cnq subscribe have stopped.")
    else:
        pass


def startCallback(message):
    print("[EmQuantAPI Python]", message)
    return 1


try:
    # 调用登录函数（激活后使用，不需要用户名密码）
    loginResult = c.start("ForceLogin=1", '', mainCallback)
    if(loginResult.ErrorCode != 0):
        print("login in fail")
        exit()
    print(" 获取专题报表重要持股人-2021年3月8日")
  
  
    # 2021-03-08 15:58:30
    # 展示了大股东、高管及其关联人在二级市场的股份增减持情况 参数: 起始日期 截止日期 证券代码 股东类型 字段: 代码 名称 公告日期 股东名称 股东类型 是否实际控制人 高管职务 方向 变动_流通股数量(万股) 变动_占流通股比例(%) 变动_大宗交易转让(万股) 变动后_持流通股数量(万股) 变动后_占流通股比例(%) 变动后_持股总数(万股) 变动后_占总股本比例(%) 成交均价(元) 最新收盘价(元) 最新价格较成交均价涨跌幅(%) 变动期间股票均价(元) 变动部分参考市值(万元) 变动起始日期 变动截止日期 说明 东财三级行业 证监会行业(2012) 变动类型
    startDate="2021-04-28"
    endDate="2021-04-28"
    options="StartDate="+startDate+",EndDate="+endDate+",secucode=,HoldType=0"
    data_shareholder=c.ctr("HoldTradeDetailInfo",
        "SECURITYCODE,SECURITYSHORTNAME,NOTICEDATE,SHAREHDNAME,SHAREHDTYPE,IS_controller,POSITION1,FX,CHANGENUM,BDSLZLTB,TGDZJYPTZR,BDHCYLTGSL,BDHCYLTSLZLTGB,BDHCGZS,BDHCGBL,JYPJJ,NEW,DEC_JYPJJ_RATE,BDQJGPJJ,BDBFCKSZ,BDQSRQ,BDJZRQ,CLB_REMARK,STR_PUBLISHNAMEDC3,STR_PUBLISHNAMEZJH,TYPE"
        ,options)
    if(data_shareholder.ErrorCode != 0):
        print("request ctr Error, ", data_shareholder.ErrorMsg)
    else:
        print("ctr输出结果======分割线======")
        
        # 创建 DataFrame 结构数据
        label=data_shareholder.Indicators
        df=pd.DataFrame(columns=label)
        file="shareholder_all-"+startDate+"_"+endDate+".csv"
        df.to_csv(file)

        pd_data=dict_convert_dataframe(file,data_shareholder.Data,label,df)
        # 将DataFrame 结构数据 输出为csv
        # pd_data.to_csv("shareholder_601919.SH-20140630-20210305.csv")
        # pd_data.to_csv("shareholder_all-20200101-20210305.csv")


except Exception as ee:
    print("error >>>", ee)
    traceback.print_exc()
else:
    print("获取专题报表重要持股人-end")

finally:
    # 退出
    data_shareholder = logoutResult = c.stop()
  

